package cn.supermarket.service.impl;

import cn.supermarket.ex.ServiceException;
import cn.supermarket.mapper.ProductOutputMapper;
import cn.supermarket.pojo.dto.AddProductOutputDTO;
import cn.supermarket.pojo.dto.UpdateProductOutputDTO;
import cn.supermarket.pojo.entity.ProductOutput;
import cn.supermarket.pojo.vo.ProductOutputVO;
import cn.supermarket.service.iservice.IProductOutputService;
import cn.supermarket.service.iservice.IStockService;
import cn.supermarket.utils.SnowFlakeGenerateIdWorker;
import cn.supermarket.web.State;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

/**
 * <p>
 * 出库记录实现类
 * </p>
 *
 * @author theThe
 * @date 2022/7/6 13:25
 */
@Service
public class ProductOutPutServiceImpl implements IProductOutputService {

    @Autowired
    private ProductOutputMapper productOutputMapper;
    @Autowired
    private IStockService stockService;

    /**
     * 添加出库记录
     * @param addProductOutputDTO 出库记录
     */
    @Transactional
    @Override
    public void addOutboundRecord(AddProductOutputDTO addProductOutputDTO) {
        // 实例化ProductOutput对象
        ProductOutput productOutput = new ProductOutput();
        // 复制同名属性
        BeanUtils.copyProperties(addProductOutputDTO, productOutput);
        // 获得当前时间
        LocalDateTime now = LocalDateTime.now();
        // 雪花算法生成随机id
        SnowFlakeGenerateIdWorker snowFlakeGenerateIdWorker = new SnowFlakeGenerateIdWorker(0L, 0L);
        Long orderNo = snowFlakeGenerateIdWorker.nextId();
        // 补全其他信息
        productOutput.setIsEnable(0);
        productOutput.setIsDisplay(1);
        productOutput.setIsCancel(0);
        productOutput.setDeliveryOrderNo(orderNo);
        productOutput.setBillOfLadingNo(orderNo);
        productOutput.setGmtCreate(now);
        productOutput.setGmtModify(now);
        // 执行添加
        productOutputMapper.insertAddOutboundRecord(productOutput);
        // 调用库存方法减去库存
        stockService.reduceProductCount(addProductOutputDTO.getProductId(),addProductOutputDTO.getQuantity());
    }

    /**
     * 修改信息
     * @param updateProductOutputDTO 出库信息
     */
    @Override
    public void updateInfo(UpdateProductOutputDTO updateProductOutputDTO) {
        // 通过用户输入的id查询
        List<ProductOutputVO> list = productOutputMapper.getListByDeliveryOrderNo(updateProductOutputDTO.getDeliveryOrderNo());
        // 判断结果是否为空
        if (list.isEmpty()) {
            // 如果为空,抛出异常
            throw new ServiceException(State.ERR_NOT_FOUND, "单号错误");
        }
        // 设置最后修改信息为现在
        updateProductOutputDTO.setGmtModify(LocalDateTime.now());
        // 执行修改
        productOutputMapper.updateInfoByDeliveryOrderNo(updateProductOutputDTO);
    }

    /**
     * 按照单号查询
     * @param deliveryOrderNo 出库单号
     * @return 出库记录列表
     */
    @Override
    public List<ProductOutputVO> getListByDeliveryOrderNo(Long deliveryOrderNo) {
        // 通过单号查询出库记录列表
        List<ProductOutputVO> list = productOutputMapper.getListByDeliveryOrderNo(deliveryOrderNo);
        // 判断是否为空
        if (list.isEmpty()) {
            // 如果为空,抛出异常
            throw new ServiceException(State.ERR_NOT_FOUND, "单号错误");
        }
        // 返回查询到的结果
        return list;
    }

    /**
     * 按照日期查询
     * @param date 日期
     * @return 出库记录列表
     */
    @Override
    public List<ProductOutputVO> getListByDate(Date date) {
        // 通过日期查询出库记录列表
        List<ProductOutputVO> list = productOutputMapper.getListByDate(date);
        // 判断是否为空
        if (list.isEmpty()) {
            // 如果为空,抛出异常
            throw new ServiceException(State.ERR_NOT_FOUND, "当前日期暂无数据");
        }
        // 返回查询到的结果
        return list;
    }
}
